package com.woniuxy.config.topic;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: 马宇航
 * @主题模式: 根据订单中的状态，支付，取消，退款，订单状态队列
 * @DateTime: 25/09/01/星期一 10:53
 * @Component: 成都蜗牛学苑
 **/
@Configuration
public class TopicMQConfig {
    @Bean
    public Queue topicQueue() {
        Map<String, Object> args = new HashMap<>();
        //设置队列中的消息的最大存活时间 15min 模拟效果1分钟
        args.put("x-message-ttl",1000*30*1);
        //配置消息进入哪个死信交换机，和死信routingkey
        args.put("x-dead-letter-exchange","order.dlx.outime.nopay");
        args.put("x-dead-letter-routing-key","order.dlx");
        // 队列需要过期时间
        return new Queue("order.pay",true,false,true,args);
    }
    @Bean
    public Queue topicQueue2() {
        //模拟订单取消队列（抢优惠卷），超过5个，后续新增的订单，就进入死信，丢最新的信息
        Map<String, Object> args = new HashMap<>();
        args.put("x-max-length",5);
        //抛弃最新的任务，还需要指定策略
        args.put("x-overflow","reject-publish-dlx");
        args.put("x-dead-letter-exchange","order.dlx.outime.nopay");
        //队列换一下，交换机用同一个。队列来一个新的。
        args.put("x-dead-letter-routing-key","order.dlx.cancel");
        return new Queue("order.cancel",true,false,true,args);
    }
    @Bean
    public Queue topicQueue3() {
        //模拟TD但是超过了TD时间,拒绝退订. 进入死信, 死信消费者,发消息给用户
        Map<String, Object> args = new HashMap<>();
        args.put("x-dead-letter-exchange","order.dlx.outime.nopay");
        //队列换一下，交换机用同一个。队列来一个新的。
        args.put("x-dead-letter-routing-key","order.dlx.cancel");
        return new Queue("order.refund",true,false,false,args);
    }
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("order.topic",true,true);
    }
    @Bean
    public Binding bindingTopic1(){
        //订单支付队列: 订单号里面有201的，就走支付队列 2025015.201.123165135453030
        // * 匹配一个单词 必须用.来隔开,
        return BindingBuilder.bind(topicQueue()).to(topicExchange()).with("pay.#");
    }
    @Bean
    public Binding bindingTopic2(){
        //订单取消队列: 订单号里面有202的，就走取消队列 2025015.202.123165135453030
        return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("#.202.#");
    }
    @Bean
    public Binding bindingTopic3(){
        //订单退款队列: 订单号里面有203的，就走退款队列 2025015.1231651354.53030.203
        return BindingBuilder.bind(topicQueue3()).to(topicExchange()).with("#.TD");
    }

}
